题解
贪心加优先队列。
每当油不够时,pop出经过的最大容量的加油站,加完油。
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include <stdio.h> #include <queue> #include <iostream> #include <algorithm> using namespace std; const int MAXN=10010; struct stop { int dis; int value; }ss[MAXN]; bool cmp(stop a, stop b){ return a.dis > b.dis; } int main() { int n,l,p; while(~scanf("%d",&n)){ for(int i=1;i<=n;i++) scanf("%d%d",&ss[i].dis,&ss[i].value); scanf("%d%d",&l,&p); ss[++n].value=0; ss[n].dis=0; sort(ss+1,ss+1+n,cmp); priority_queue<int > pque; int ans=0,pos=l,tank=p; for(int i=1;i<=n;i++){ int d = pos-ss[i].dis; while(tank - d < 0){ if(pque.empty()){ ans = -1; break; } tank += pque.top(); pque.pop(); ans++; } if(ans == -1)break; tank -= d; pos=ss[i].dis; pque.push(ss[i].value); } printf("%d\n",ans); } return 0; }
|